package com.cy.pj.sys.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import com.cy.pj.common.bo.Node;
import com.cy.pj.common.bo.SysUserMenu;
import com.cy.pj.sys.pojo.SysMenu;


/**
 * 操作菜单表数据的一个数据层对象
 */
@Mapper
public interface SysMenuDao {
	
	/** 获取所有菜单的id,name,parentId 在客户端会基于这些数据呈现树结构 */
	@Select("select id,name,parentId from sys_menus")
	List<Node> findZtreeMenuNodes();
	
	/** 查询是否有子元素 */
	@Select("select count(*) from sys_menus where parentId=#{id}")
	int getChildCount(Integer id);
	
	/** 基于id删除菜单元素 */
	@Delete("delete from sys_menus where id=#{id}")
	int deleteObject(Integer id);
	
	/**
	 * 查询所有菜单的信息,一行记录映射为内存中的一个Map对象
	 * key:表中的字段名
	 * value:表中字段对应的数据
	 * 在内存中使用Map对象封装从数据库查询到的数据有什么优势,劣势?
	 * 优势:灵活,因为可以存储任意key数据,开发速度快(不用写pojo类)
	 * 劣势:可读性差,打开源码不知道存的什么,值的类型不可控
	 * --在实际项目中,外包项目经常会用map封装数据(不关心质量关心效率), 公司产品级应用(要求比较高),能用pojo则用pojo(可读性好,好维护)
	 * 查询时不用指定pojo直接可以查询,但是缺点为数据类型不明确
	 * 为什么一行记录映射为一个Map对象呢?Map中key相同值会覆盖
	 * @return 一行记录映射为一个map对象,所有map对象使用List进行封装
	 */
	List<Map<String,Object>> findObjects();
	
	int insertObject(SysMenu sysMenu);
	
	int updateObject(SysMenu sysMenu);
	
	/** 查询用户能访问的菜单(1级和2级) */
	List<SysUserMenu> findMenusByIds(@Param("menuIds") List<Integer> menuIds);
}
